package cn.edu.zhku.shiro.service.impl;

import cn.edu.zhku.mapper.TokenMapper;
import cn.edu.zhku.pojo.Token;
import cn.edu.zhku.shiro.service.ShiroService;
import cn.edu.zhku.util.TokenGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

@Service
public class ShiroServiceImpl implements ShiroService {

    @Autowired
    private TokenMapper tokenMapper;

    // 15天后失效
    @Value("${shiro.token-expire}")
    private Long tokenExpire;

    /**
     * 生成一个token
     * @param userId
     * @return
     */
    @Override
    @Transactional
    public Token getToken(Integer userId) {
        // 生成一个token
        String token = TokenGenerator.generateValue();
        // 当前时间
        Date now = new Date();
        // 过期时间
        Date expireTime = new Date(now.getTime() + tokenExpire * 1000);
        // 判断是否生成过token
        Token tokenPojo = this.tokenMapper.selectById(userId);
        if (tokenPojo == null) {
            // 保存token
            tokenPojo = new Token();
            tokenPojo.setUserId(userId);
            tokenPojo.setToken(token);
            tokenPojo.setUpdateTime(now);
            tokenPojo.setExpireTime(expireTime);
            this.tokenMapper.insertOne(tokenPojo);
        } else {
            // 更新token
            tokenPojo.setToken(token);
            tokenPojo.setUpdateTime(now);
            tokenPojo.setExpireTime(expireTime);
            this.tokenMapper.updateOne(tokenPojo);
        }
        return tokenPojo;
    }

    /**
     * 更新数据库的token，使前端的token失效
     * @param token
     */
    @Override
    @Transactional
    public void logout(String token) {
        Token tokenPojo = this.tokenMapper.selectByToken(token);
        // 生成一个token
        token = TokenGenerator.generateValue();
        // 修改token
        tokenPojo.setToken(token);
        // 更新token
        this.tokenMapper.updateOne(tokenPojo);
    }
}
